From: Andre Przywara Date: Fri, 1 Oct 2010 16:21:01 +0000 (+0100) Subject: libxl: implementing legacy xm cpuid parser X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~11424 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https:/%22bookmarks://%22Dat/%22http:/www.example.com/cgi/%22https:/%22bookmarks:/%22Dat?a=commitdiff_plain;h=485fb4cf492812a161af377d28c32d2be44f8eec;p=xen.git libxl: implementing legacy xm cpuid parser To support compatibility with the xm config files, add a parser for the old style cpuid= syntax. This uses a Python list, so it can be distinguished from the new syntax easily. Signed-off-by: Andre Przywara Signed-off-by: Stefano Stabellini committer: Stefano Stabellini --- diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index b61f8599c3..7e7bc3ddeb 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -3743,6 +3743,66 @@ int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str) return 0; } +/* parse a single list item from the legacy Python xend syntax, where + * the strings for each register were directly exposed to the user. + * Used for maintaining compatibility with older config files + */ +int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid, + const char* str) +{ + char *endptr; + unsigned long value; + uint32_t leaf, subleaf = XEN_CPUID_INPUT_UNUSED; + struct libxl__cpuid_policy *entry; + + /* parse the leaf number */ + value = strtoul(str, &endptr, 0); + if (str == endptr) { + return 1; + } + leaf = value; + /* check for an optional subleaf number */ + if (*endptr == ',') { + str = endptr + 1; + value = strtoul(str, &endptr, 0); + if (str == endptr) { + return 2; + } + subleaf = value; + } + if (*endptr != ':') { + return 3; + } + str = endptr + 1; + entry = cpuid_find_match(cpuid, leaf, subleaf); + for (str = endptr + 1; *str != 0;) { + if (str[0] != 'e' || str[2] != 'x') { + return 4; + } + value = str[1] - 'a'; + endptr = strchr(str, '='); + if (value < 0 || value > 3 || endptr == NULL) { + return 4; + } + str = endptr + 1; + endptr = strchr(str, ','); + if (endptr == NULL) { + endptr = strchr(str, 0); + } + if (endptr - str != 32) { + return 5; + } + entry->policy[value] = calloc(32 + 1, 1); + strncpy(entry->policy[value], str, 32); + entry->policy[value][32] = 0; + if (*endptr == 0) { + break; + } + for (str = endptr + 1; *str == ' ' || *str == '\n'; str++); + } + return 0; +} + char *libxl_tmem_list(libxl_ctx *ctx, uint32_t domid, int use_long) { int rc; diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index a1e0fa400c..21030e4d70 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -412,6 +412,8 @@ int libxl_device_pci_list_assigned(libxl_ctx *ctx, libxl_device_pci **list, uint int libxl_device_pci_list_assignable(libxl_ctx *ctx, libxl_device_pci **list, int *num); int libxl_device_pci_parse_bdf(libxl_ctx *ctx, libxl_device_pci *pcidev, const char *str); int libxl_cpuid_parse_config(libxl_cpuid_policy_list *cpuid, const char* str); +int libxl_cpuid_parse_config_xend(libxl_cpuid_policy_list *cpuid, + const char* str); /* * Functions for allowing users of libxl to store private data